前言
非同步程式設計基本上就是沒有等待或非阻塞程式的設計模型,在Flutter中,非同步是用Future來修飾並執行在event loop內,可有效防止網路對UI繪製的影響。
isolate
(一) 介紹
isolate是透過Flutter Engine的執行緒來實現,而這個執行緒則是由Flutter管理並建立。所有的Dart語言都是在isolate上執行的,應用程式啟動後,開始執行main函式並執行main isolate。isolate有自己的記憶體位址和event loop,但要注意,多個isolate無法共用記憶體,必須透過API通訊才可以。每個isolate包含一個事件迴圈和兩個事件佇列,分別是microTask queue和event queue。
(二)事件迴圈event loop
我們用這張圖來解釋程式運作的原理,一共分為四個步驟。
1.啟動App並執行main方法。
2.啟動event loop,並執行佇列中的任務直到microtask queue為空,每次都是依照先進先出的原則處理。
3.確定microtask queue為空後,開始處理event loop,一樣是依照先進先出的原則,直到event queue為空。
4. microtask queue和event queue都為空後,就可退出App。
(三)執行緒模型
前面所提到的Flutter Engine其實是由embedder所負責,embedder是平台引擎移植的中間層程式,總共提供四種Task Runner。
下圖是Flutter Engine的執行架構。
•UI Task Runner:負責執行在執行緒對應到平台的執行緒上,為子執行緒。
•GPU Task Runner:用於執行與裝置GPU相關的呼叫,將UI Task Runner產生的Layer Tree提供的資訊轉成GPU指令。
•IO Task Runner:同樣屬於子執行緒,負責預先處理一些讀取操作,避免卡頓。
•Platform Task Runner:這是Flutter Engine中的主Task Runner,不僅可以處理與Engine的互動,還可以處理來自Android/iOS的互動。
(四)如何建立isolate?
透過isolate.spawn建立一個isolate。
今天介紹了很多東西,希望對大家有幫助,明天將會介紹路由,敬請期待。
參考資料
橫跨Android及Apple的神話:用Dart語言神啟Flutter大業6.5節
https://ithelp.ithome.com.tw/articles/10233915
https://iter01.com/601637.html
https://iter01.com/160524.html
https://ithelp.ithome.com.tw/articles/10243766
https://iter01.com/441301.html